package com.unitd.frame.mybatis.codegen;

import com.unitd.frame.comm.utils.StringUtils;
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.exception.InvalidConfigurationException;
import org.mybatis.generator.exception.XMLParserException;
import org.mybatis.generator.internal.DefaultShellCallback;

import java.io.*;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * @desc mybatis 自动生成代码工具类,用于处理根据指定的generator.xml配置文件,生成相应的Mybatis相关代码
 * @filename MyBatisGeneratorTools.java
 * @copyright www.unitd.com
 * @author Hudan
 * @version 1.0
 * @date 2017/2/4
 */
public class MyBatisGeneratorTools {

	/**
	 * @desc 读取指定的配置文件信息,调用mybatis的generator自动生成mybatis对应的entity、dao、mapper文件
	 */
	public static void generatorMyBatisFiles(String genCfgFile) {
		// 读取配置文件; 默认src的一级目录下
		if(StringUtils.isNull(genCfgFile)) {
			genCfgFile = "/generator/generatorConfig.xml";
		}
		File configFile = new File(Thread.currentThread().getClass().getResource(genCfgFile).getFile());

		try {
			InputStream fis = new FileInputStream(configFile);
			// 根据配置信息,生成Mybatis相应的代码文件啊金
			generatorMyBatisFiles(fis);
			fis.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * @desc 将配置文件读入InputStream流后,调用mybatis的generator自动生成mybatis对应的entity、dao、mapper文件
	 */
	private static void generatorMyBatisFiles(InputStream inputStream) {
		List<String> warnings = new ArrayList<>();
		ConfigurationParser cp = new ConfigurationParser(warnings);
		Configuration config;

		try {
			config = cp.parseConfiguration(inputStream);

			DefaultShellCallback callback = new DefaultShellCallback(true);
			MyBatisGenerator myBatisGenerator;
			try {
				myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
				myBatisGenerator.generate(null);

				// 打印结果
				for (String str : warnings) {
					System.out.println(str);
				}
			} catch (SQLException | IOException | InterruptedException | InvalidConfigurationException e) {
				e.printStackTrace();
			}
		} catch (IOException | XMLParserException e) {
			e.printStackTrace();
		}
		System.out.println("执行完成!");
	}
}